home *** CD-ROM | disk | FTP | other *** search
/ PC Gamer (Italian) 30 / PC Gamer IT CD 30 1-2.iso / MOTS / GAMEDATA / RESOURCE / JKMRES.GOO / cog_force_farsight.cog < prev    next >
Text File  |  1998-02-25  |  13KB  |  522 lines

  1. # Jedi Knight Cog Script
  2. #
  3. # FORCE_FARSIGHT.COG
  4. #
  5. # FORCEPOWER Script - Seeing
  6. #  Bin 35
  7. #
  8. # [YB]
  9. #
  10. # (C) 1997 LucasArts Entertainment Co. All Rights Reserved
  11.  
  12.  
  13. symbols
  14.  
  15. thing       player                           local
  16.  
  17. int         done=0                           local
  18. int         active=0                         local
  19. int         old_camera                       local
  20. int         camera=-1                        local
  21.  
  22. flex        cost=50.0                        local
  23. flex        useCost=5.0                      local
  24. int         rank=0                           local
  25. flex        mana                             local
  26. flex        tempFlex                         local
  27.  
  28. vector      tempvec                          local
  29. vector      tempvec2                         local
  30. vector      motionVector                     local
  31.  
  32. flex        startHealth=0                    local
  33. vector      startPosition                    local
  34.  
  35. sound       seeingSound=ForceSee01.WAV       local
  36. sound       seeingSound2=FarSight1.wav       local
  37. template    camera_tpl=+FarSight             local
  38.  
  39. int         farsightEffectHandle=-1          local
  40.  
  41. int         channel=-1                       local
  42. int         inbubble=0                       local
  43. int         bouncing=0                       local
  44.  
  45. int         multiCap=0                       local
  46. int         oldFlags                         local
  47.  
  48. message     startup
  49. message     shutdown
  50. message     activated
  51. message     timer
  52. message     pulse
  53. message     newplayer
  54. message     killed
  55. message     selected
  56. message     enterbubble
  57. message     exitbubble
  58. message     playeraction
  59. message     user0
  60.  
  61. end
  62.  
  63. # ========================================================================================
  64.  
  65. code
  66.  
  67. startup:
  68.    player = GetLocalPlayerThing();
  69.    inbubble = 0;
  70.    call stop_power;
  71.  
  72.    Return;
  73.  
  74. # ........................................................................................
  75.  
  76. shutdown:
  77.    call stop_power;
  78.  
  79.    Return;
  80.  
  81. # ........................................................................................
  82.  
  83. activated:
  84.    if(inbubble) Return;
  85.  
  86.    // If the IR goggles are active.
  87.    if(GetInv(player, 41))
  88.    {
  89.       if(IsInvActivated(player, 41))
  90.       {
  91.          // Deactivate the IR goggles.
  92.          SendMessage(GetInvCog(player, 41), activated);
  93.       }
  94.    }
  95.  
  96.    // If we are armed with the scope or the EWEB, disarm.
  97.    if((GetCurWeapon(player) == 13) || (GetCurWeapon(player) == 10))
  98.       SelectWeapon(player, 1);      // Select fists.
  99.  
  100.    // Cannot cast this underwater, controls would be wrong...
  101.    if(GetSectorFlags(GetThingSector(player)) & 2) Return;
  102.  
  103.    if(IsInvActivated(player, 35)) Return;
  104.  
  105.    mana = GetInv(player, 14);
  106.    if(mana >= cost || GetInv(player, 14) >= GetInv(player, 69))
  107.    {
  108.       if(GetInv(player, 64) != 1) ChangeInv(player, 14, -cost);
  109.  
  110.       // Send a "force disturbance"...
  111.       if(!IsMulti())
  112.          SendMessageExRadius(GetThingPos(player), cost, 0x4, splash, 35, 0, 0, 0);
  113.  
  114.       rank = GetInv(player, 35);
  115.       PlayMode(player, 24);
  116.  
  117.       // Play activation sound
  118.       PlaySoundThing(seeingSound, player, 1.0, -1, -1, 0x80);
  119.  
  120.       motionVector = '0 0 0';
  121.  
  122.       // Find a position just in front of the player.
  123.       //tempvec = GetThingPos(player);
  124.       //tempvec = VectorAdd(tempvec, VectorScale(GetThingLVec(player), GetThingCollideSize(player)));
  125.       //camera = CreateThingAtPos(camera_tpl, GetThingSector(player), tempvec, GetThingLVec(player));
  126.  
  127.       // FireProjectile will handle things like creating the object in a wall, etc.
  128.       // It actually traces to the creation point and stops before if necessary,
  129.       // so if you face a wall the camera is created in front of it...
  130.       camera = FireProjectile(player, camera_tpl, -1, 24, '0 0.06 0.02', GetThingLVec(player), 1.0, 0, 0, 0);
  131.  
  132.       old_camera = GetCurrentCamera();
  133.       SetCurrentCamera(0);
  134.       SetCameraFocus(0, camera);
  135.  
  136.       farsightEffectHandle = newColorEffect(0, 0, 0,  0, 0, 0,  64, 64, 0,  1.0);
  137.  
  138.       // Play loop sound at 0.0 volume and fade it in to 1.0 volume in 0.75 secs
  139.       channel = PlaySoundThing(seeingSound2, camera, 0.0, -1, -1, 0x81);
  140.       ChangeSoundVol(channel, 1.0, 0.75);
  141.  
  142.       StopThing(player);
  143.       SetActionCog(GetSelfCog(), 0x7FFFFFFF);
  144.  
  145.       active = 1;
  146.       SetInvActivated(player, 35, 1);
  147.  
  148.       startHealth = GetThingHealth(player);
  149.       startPosition = GetThingPos(player);
  150.  
  151.       SetPulse(0.5);
  152.  
  153.       SetBinWait(player, 35, 1.0);
  154.  
  155.       // Prepare to stop the power after a period according to rank
  156.       if(IsMulti())
  157.       {
  158.          if(rank == 1) SetTimerEx(6, 2, 0, 0);
  159.          else
  160.          if(rank == 2) SetTimerEx(12, 2, 0, 0);
  161.          else
  162.          if(rank == 3) SetTimerEx(18, 2, 0, 0);
  163.          else
  164.          if(rank == 4) SetTimerEx(24, 2, 0, 0);
  165.       }
  166.       else
  167.       {
  168.          if(rank == 1) SetTimerEx(4, 2, 0, 0);
  169.          else
  170.          if(rank == 2) SetTimerEx(8, 2, 0, 0);
  171.          else
  172.          if(rank == 3) SetTimerEx(12, 2, 0, 0);
  173.          else
  174.          if(rank == 4) SetTimerEx(16, 2, 0, 0);
  175.       }
  176.  
  177.       // Don't allow a deactivation for 1 second.
  178.       bouncing = 1;
  179.       SetTimerEx(1, 3, 0, 0);
  180.    }
  181.  
  182.    Return;
  183.  
  184. # ........................................................................................
  185.  
  186. playeraction:
  187.  
  188.    if(GetSectorFlags(GetThingSector(player)) & 2)
  189.    {
  190.       call stop_power;
  191.       ReturnEx(0.0);
  192.       Return;
  193.    }
  194.  
  195.    if(!active)
  196.    {
  197.       ReturnEx(0.0);
  198.       Return;
  199.    }
  200.  
  201.  
  202.    if (GetParam(0) == 0.0)             // Jump
  203.    {
  204.       tempFlex = 0.0;
  205.  
  206.          // Only allow motion at one speed.
  207.       if (GetParam(2) != 0.0)
  208.          tempFlex = 2.8;
  209.  
  210.       motionVector = VectorSet(VectorX(motionVector), tempFlex, VectorZ(motionVector));
  211.       ReturnEx(0.0);
  212.    }
  213.    else
  214.    if (GetParam(0) == 1.0)             // Crouch
  215.    {
  216.       tempFlex = 0.0;
  217.  
  218.          // Only allow motion at one speed.
  219.       if (GetParam(2) != 0.0)
  220.          tempFlex = 2.8;
  221.  
  222.       motionVector = VectorSet(VectorX(motionVector), -tempFlex, VectorZ(motionVector));
  223.       ReturnEx(0.0);
  224.    }
  225.    else
  226.    if (GetParam(0) == 2.0)             // Activated
  227.    {
  228. //    print("Activation!");
  229.       call stop_power;
  230.       ReturnEx(0.0);
  231.    }
  232.    else
  233.    if (GetParam(0) == 3.0)             // Fire
  234.    {
  235.       // Allow the player to fire only the Manual sequencers
  236.       if(GetCurWeapon(player) == 18)
  237.          ReturnEx(1.0);
  238.       else
  239.          ReturnEx(0.0);
  240.    }
  241.    else
  242.    if (GetParam(0) == 4.0)             // Strafe
  243.    {
  244.       motionVector = VectorSet(GetParam(2), VectorY(motionVector), VectorZ(motionVector));
  245.  
  246.       ReturnEx(0.0);
  247.    }
  248.    else
  249.    if (GetParam(0) == 5.0)             // Turn
  250.    {
  251.       tempvec = GetThingRotVel(camera);
  252.       tempvec = VectorSet(VectorX(tempvec), GetParam(2), VectorZ(tempvec));
  253.       SetThingRotVel(camera, tempvec);
  254.  
  255.       ReturnEx(0.0);
  256.    }
  257.    else
  258.    if (GetParam(0) == 6.0)             // Fwd / Bkwd Motion
  259.    {
  260.       motionVector = VectorSet(VectorX(motionVector), VectorY(motionVector), GetParam(2));
  261.  
  262.       ReturnEx(0.0);
  263.    }
  264.    else
  265.    if (GetParam(0) == 8.0)             // Pitch
  266.    {
  267.       tempvec = GetThingLVecPYR(camera);
  268.  
  269.       tempFlex = VectorX(tempvec)+(GetParam(1) / 100.0);
  270.  
  271.       // Limit the pitch vector (flipping over doesn't work right...)
  272.       if (tempFlex < -80.0)
  273.          tempFlex = -80.0;
  274.       else
  275.       if (tempFlex > 80.0)
  276.          tempflex = 80.0;
  277.  
  278.       tempvec = VectorSet(tempFlex, VectorY(tempvec), VectorZ(tempvec));
  279.       SetThingLookPYR(camera, tempvec);
  280.  
  281.       ReturnEx(0.0);
  282.    }
  283.    else
  284.    if (GetParam(0) == 10.0)         // Select Inventory Item
  285.    {
  286.       ReturnEx(0.0);
  287.    }
  288.    else
  289.    if (GetParam(0) == 11.0)         // Select Skill
  290.    {
  291.       ReturnEx(0.0);
  292.    }
  293.    else
  294.    if (GetParam(0) == 12.0)         // Use Inventory Item
  295.    {
  296.    }
  297.    else
  298.    if (GetParam(0) == 13.0)         // Use Skill
  299.    {
  300.          // If the user is activating farsight again, switch it off.
  301.       if (GetParam(1) == 2.0)
  302.          if (GetParam(2) == 35.0)
  303.             if (bouncing == 0)
  304.               call stop_power;
  305.  
  306.       ReturnEx(0.0);
  307.    }
  308.    else
  309.    if (GetParam(0) == 14.0)         // Other Actions
  310.    {
  311.       if (GetParam(2) == 0.0)    // Cycle Camera
  312.       {
  313.          if (GetCurrentCamera() == 0)
  314.          {
  315.             // We're in first person mode.  Turn off the
  316.             // tint because we're about to go into third.
  317.             if(farsightEffectHandle != -1)
  318.             {
  319.                freeColorEffect(farsightEffectHandle);
  320.                farsightEffectHandle = -1;
  321.             }
  322.          }
  323.          else
  324.          {
  325.             // We're in third person mode.  Turn on the tint
  326.             // because we are about to go in first.
  327.             if (farsightEffectHandle != -1)
  328.             {
  329.                freeColorEffect(farsightEffectHandle);
  330.                farsightEffectHandle = -1;
  331.             }
  332.  
  333.             farsightEffectHandle = newColorEffect(0, 0, 0,  0, 0, 0,  64, 64, 0,  1.0);
  334.          }
  335.       }
  336.  
  337.       ReturnEx(1.0);
  338.    }
  339.    else
  340.    {
  341.       ReturnEx(0.0);
  342.    }
  343.  
  344.    // Add up the various velocities.
  345.    tempvec  = GetThingLVec(camera);
  346.    tempvec  = VectorScale(tempvec, VectorZ(motionVector) / 3.0);
  347.    tempvec2 = GetThingUVec(camera);
  348.    tempvec2 = VectorScale(tempvec2, VectorY(motionVector) / 3.0);
  349.    tempvec  = VectorAdd(tempvec, tempvec2);
  350.    tempvec2 = GetThingRVec(camera);
  351.    tempvec2 = VectorScale(tempvec2, VectorX(motionVector) / 3.0);
  352.    tempvec  = VectorAdd(tempvec, tempvec2);
  353.  
  354.    SetThingVel(camera, tempvec);
  355.  
  356.    if(IsMulti())
  357.    {
  358.       if(multiCap) Return;
  359.       multiCap = 1;
  360.  
  361.       ClearPhysicsFlags(camera, 0x4000000);
  362.       SyncThingPos(camera);
  363.  
  364.       // prepare to reset the multiCap variable
  365.       SetTimerEx(0.33, 4, 0, 0);
  366.  
  367.       // we have to wait a bit before setting the PF_NOSYNC flag again, because
  368.       // SyncThingPos() is not instantaneous but accumulated by frame so the real
  369.       // synching would never be executed if I set the flag immediately !
  370.       SetTimerEx(0.05, 5, 0, 0);
  371.    }
  372.  
  373.    Return;
  374.  
  375. # ........................................................................................
  376.  
  377. timer:
  378.  
  379.    if (GetSenderId() == 1)
  380.    {
  381.       // Turn off control capture.
  382.       SetActionCog(-1, 0);
  383.       SetInvActivated(player, 35, 0);
  384.    }
  385.    else
  386.    if(GetSenderId() == 2)                    // Deactivate power.
  387.    {
  388.       call stop_power;
  389.    }
  390.    else
  391.    if (GetSenderId() == 3)
  392.    {
  393.       bouncing = 0;
  394.    }
  395.    else
  396.    if (GetSenderId() == 4)
  397.    {
  398.       multiCap = 0;
  399.    }
  400.    else
  401.    if (GetSenderId() == 5)
  402.    {
  403.       SetPhysicsFlags(camera, 0x4000000);
  404.    }
  405.  
  406.    Return;
  407.  
  408. # ........................................................................................
  409.  
  410. pulse:
  411.    // check that the player didn't die
  412.    if(GetThingHealth(player) < 1)
  413.    {
  414.       call stop_power;
  415.       Return;
  416.    }
  417.  
  418.    // and that he didn't take health damage
  419.    if(GetThingHealth(player) < startHealth)
  420.    {
  421.       call stop_power;
  422.       Return;
  423.    }
  424.  
  425.    // If he changed position (blown by explosion, pushed, ...) stop the power
  426.    if(!VectorEqual(startPosition, GetThingPos(player)))
  427.    {
  428.       call stop_power;
  429.       Return;
  430.    }
  431.  
  432.    // check that the eye isn't too near a bubble
  433.    // BTW, we tweaked this distance to 0.75 instead of the
  434.    // usual 1.0 to help find the player with the Y in KFY.
  435.    if(jkGetBubbleDistance(camera) <= 0.75)
  436.    {
  437.       call stop_power;
  438.       Return;
  439.    }
  440.  
  441.    if(GetInv(player, 14) < useCost)
  442.    {
  443.       call stop_power;
  444.       Return;
  445.    }
  446.  
  447.    if(GetInv(player, 64) != 1) ChangeInv(player, 14, -useCost);
  448.  
  449.    Return;
  450.  
  451. # ........................................................................................
  452.  
  453. selected:
  454.    jkPrintUNIString(player, 35);
  455.    Return;
  456.  
  457. # ........................................................................................
  458.  
  459. killed:
  460.    if(GetSenderRef() != player) Return;
  461.  
  462. newplayer:
  463.    call stop_power;
  464.    Return;
  465.  
  466. # ........................................................................................
  467.  
  468. enterbubble:
  469.    inbubble = 1;
  470.    call stop_power;
  471.    Return;
  472.  
  473. # ........................................................................................
  474.  
  475. exitbubble:
  476.    inbubble = 0;
  477.    Return;
  478.  
  479. # ........................................................................................
  480.  
  481. user0:
  482.    call stop_power;
  483.    Return;
  484.  
  485. # ........................................................................................
  486.  
  487. stop_power:
  488.    if(active)
  489.    {
  490.       SetCameraFocus(0, player);
  491.       SetCurrentCamera(old_camera);
  492.       DestroyThing(camera);
  493.  
  494.       if(farsightEffectHandle!=-1)
  495.       {
  496.          freeColorEffect(farsightEffectHandle);
  497.          farsightEffectHandle = -1;
  498.       }
  499.    }
  500.  
  501.    SetPulse(0);
  502.  
  503.    if(channel != -1)
  504.    {
  505.       StopSound(channel, 0.1);
  506.       channel = -1;
  507.    }
  508.  
  509.    KillTimerEx(2);
  510.  
  511.    active = 0;
  512.    bouncing = 0;
  513.    multiCap = 0;
  514.  
  515.    SetTimerEx(0.5, 1, 0, 0);
  516.  
  517.    Return;
  518.  
  519. end
  520.  
  521.  
  522.